package pers.han.thread;

/**
 *  线程通知与唤醒
 * @author mingshan
 *
 */
public class ThreadCommunication {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        final Business business = new Business();
        new Thread(
            new Runnable() {
                @Override
                public void run() {
                    for(int i = 1; i <= 50; i++) {
                        business.sub(i);
                    }
                }
            }
        ).start();

        for (int i = 1; i <= 50; i++) {
            business.main(i);
        }
    }
}

class Business {
    private boolean bShouldSub = true;
    public synchronized void sub(int i) {
        //不是我走，所以我要等待
        while (!bShouldSub) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        for (int j = 1; j <= 10; j++) {
            System.out.println("sub thread sequence of " + j + ",loop of " + i);
        }

        bShouldSub = false;
        this.notify();
    }

    public synchronized void main(int i) {
        //该 sub运行，所以等待    
        while (bShouldSub) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        for (int j = 1; j <= 100; j++) {
            System.out.println("main thread sequence of " + j + ",loop of " + i);
        }

        bShouldSub = true;
        this.notify();
    }
}
